pronoun_use_post <- pronoun_use_by_donald_posts %>%
  mutate(id = str_sub(link_id,start = -6)) %>%
  left_join(filter(posts_in_donald, num_comments > 9),by = c("id" = "id")) %>%
  transmute(
            num_comments=num_comments.x,
            collective=collective,
            individual=individual,
            contains_we = contains_we,
            title=title,
            selftext=selftext,
            domain=domain,
            selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
            score=score,
            created_utc = created_utc,
            date = as.POSIXct(created_utc,tz="", origin="1970-01-01")
            ) %>% filter(#!is.na(collective),
                         num_comments > 500)
colSums(is.na(pronoun_use_post))
num_comments   collective   individual  contains_we        title     selftext       domain 
           0            0            0            0            0         3616            0 
    selfpost        score  created_utc         date 
           0            0            0            0 

Most and least collective posts

pronoun_use_post %>%
  filter(num_comments > 500) %>%
  arrange((collective)) #%>% head(100)
pronoun_use_post %>%
  filter(num_comments > 100) %>%
  ggplot()+
  geom_density(aes(collective))

POT8

Particular words in the title of the post

pronoun_use_post %>%
  filter(num_comments > 100) %>%
  mutate(contains_word = 
        ifelse(
    grepl("TD", (title)) | 
      grepl("t_d", tolower(title)) | 
      grepl("the_donald", tolower(title)) 
      #grepl("censor", tolower(title)) |
      #grepl("environment", tolower(title)) |
      #grepl("ice", tolower(title)) |
      #grepl("", tolower(title)) 
      ,"climate related", "unrelated"
  
                                
                                )) %>%
mutate(self_post = ifelse(is.na(selftext),"no","yes")) %>%
  group_by(contains_word) %>%
  summarise(
    collective_weighted = sum(num_comments*collective)/sum(num_comments),
    collective =  mean(collective),
    num_posts  = n(),
    total_comments = sum(num_comments)
  )
  #ggplot()+
  #geom_boxplot(aes(contains_word,collective))

Time series analysis

library(plotly)
ggplotly(
  ggplot(filter(pronoun_use_post,num_comments >150) ,aes(date,collective,size = num_comments, name = title, color = selfpost))+
  geom_point()
)

ALL POLITICAL SUBREDDITS

pronoun_use_post <- pronoun_use_by_political_posts %>%
  mutate(id = str_sub(link_id,start = -6)) %>%
  left_join(filter(posts_in_political_subs, num_comments > 9),by = c("id" = "id", "subreddit" = "subreddit") )%>%
  transmute(subreddit = subreddit,
            num_comments=num_comments.x,
            collective=collective,
            individual=individual,
            col_min_ind = contains_we - individual,
            contains_we = contains_we,
            title=title,
            full_title = paste(subreddit,title, sep=": "),
            selftext=selftext,
            domain=domain,
            selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
            score=score,
            created_utc = created_utc,
            date = as.POSIXct(created_utc,tz="", origin="1970-01-01"),
            climate_change = ifelse(
    grepl("climate", tolower(title)) | 
      grepl("temperature", tolower(title)) | 
      #grepl("pollution", tolower(title)) | 
      grepl("warming", tolower(title)) |
      grepl("environment", tolower(title)) |
      #grepl("ice", tolower(title)) |
      grepl("environment", tolower(title)) 
      ,"climate related", "unrelated"
  ),
  threat = ifelse(
    grepl("threat", tolower(title)) | 
      grepl("extinct", tolower(title)) | 
      grepl("warns", tolower(title)) 
      ,"threat related", "unrelated"
  ),
  aliens = ifelse(
    grepl("alien", tolower(title))
      
      ,"alien related", "unrelated"
  ),
  any_of_three = ifelse(
     climate_change == "climate related"| 
      threat == "threat related" |
      aliens == "alien related"
      ,"any of 3 related", "unrelated"
  )
            ) %>% filter(#!is.na(collective),
                         num_comments > 50) %>%
  left_join(read_csv("subreddit_categories.csv"), by = c("subreddit" = "subreddit"))
Parsed with column specification:
cols(
  subreddit = col_character(),
  topic_level1 = col_character(),
  topic_level2 = col_character(),
  topic_level3 = col_character(),
  t1_t2 = col_character()
)

worldnews

ALL POLITICAL SUBREDDITS

pronoun_use_post <- pronoun_use_by_worldnews2016_posts %>%
  mutate(id = str_sub(link_id,start = -6)) %>%
  left_join(filter(posts_in_political_subs, subreddit == "worldnews"),by = c("id" = "id" ))%>%
  transmute(subreddit = subreddit,
            num_comments=num_comments.x,
            collective = collective,
            score = score.x,
            
            
           
            title=title,
            
            selftext=selftext,
            domain=domain,
            selfpost=ifelse(is.na(selftext),"Not Self Post", "Self Post"),
            
            created_utc = created_utc,
            date = as.POSIXct(created_utc,tz="", origin="1970-01-01")) %>% 
            filter(#!is.na(collective),
                         num_comments > 50) %>%
  left_join(read_csv("subreddit_categories.csv"), by = c("subreddit" = "subreddit"))
Parsed with column specification:
cols(
  subreddit = col_character(),
  topic_level1 = col_character(),
  topic_level2 = col_character(),
  topic_level3 = col_character(),
  t1_t2 = col_character()
)
colSums(is.na(pronoun_use_post))
   subreddit num_comments   collective        score        title     selftext       domain 
           1            0            0            0            1         4658            1 
    selfpost  created_utc         date topic_level1 topic_level2 topic_level3        t1_t2 
           0            1            1            1            1         4841            1 

reg worldnews

worldnews_posts <- read_delim("worldnews_environmental_posts - worldnews_posts.tsv", 
    "\t", escape_double = FALSE, trim_ws = TRUE) %>%
  mutate(threat_score = case_when(
    threat_score == "e" ~ "Environmental Related",
    threat_score == "a" ~ "Alien/Space travel Related",
    TRUE ~ "Other"
    
  ))  %>% filter(!is.na(title))
Parsed with column specification:
cols(
  .default = col_character(),
  num_comments = col_integer(),
  collective = col_double(),
  individual = col_double(),
  col_min_ind = col_double(),
  contains_we = col_double(),
  score = col_integer(),
  created_utc = col_integer(),
  date = col_datetime(format = "")
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)8 parsing failures.
row # A tibble: 5 x 5 col     row col         expected     actual     file                                                  expected   <int> <chr>       <chr>        <chr>      <chr>                                                 actual 1  1119 score       an integer   unrelated  'worldnews_environmental_posts - worldnews_posts.tsv' file 2  1119 created_utc an integer   unrelated  'worldnews_environmental_posts - worldnews_posts.tsv' row 3  1119 date        "date like " unrelated  'worldnews_environmental_posts - worldnews_posts.tsv' col 4  1119 NA          24 columns   21 columns 'worldnews_environmental_posts - worldnews_posts.tsv' expected 5  2404 score       an integer   unrelated  'worldnews_environmental_posts - worldnews_posts.tsv'
... ................................. ... ................................................................................................. ........ .............................................................................................................................................................................................................................. ...... .......................................................................................................................... .... .......................................................................................................................... ... .......................................................................................................................................................... ... .................................................................................................................................... ........ ..........................................................................................................................
See problems(...) for more details.

POT 7

library(plotly)
#ggplotly(
  ggplot(worldnews_posts ,aes(date,collective,size = num_comments, name = full_title, color = threat_score))+
  geom_point()+
    theme_classic()+
    scale_y_continuous()

                  
#)
worldnews_posts %>% group_by(threat_score) %>% summarise(
  number_of_posts = n(),
  avg_collective = mean(collective),
  avg_individual = mean(individual)
)
ggplot(mutate(worldnews_posts,col_pct = 100*collective) ,aes(threat_score,col_pct,size = num_comments))+ geom_boxplot() + geom_jitter(alpha = 0.1) + theme_classic(base_size = 16)+
       labs(title = "Collective Pronoun Use by Topic in posts from /r/worldnews",
       subtitle = "All posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
       caption = "") + xlab("")+ ylab("Percentage of Comments which contains Collective Pronouns") 

       
ggplot(worldnews_posts ,aes(threat_score,individual,size = num_comments))+ geom_boxplot() 

#worldnews_posts %>% filter(threat_score == "Environmental Related") %>% arrange(desc(collective)) %>% select(collective,title, num_comments, individual,contains_we,date) %>% write_csv("worldnews_environment2.csv")

Hyp test

t.test(oss$collective,glob$collective, alternative =  "greater", mu = 0, 
    paired = FALSE, var.equal = FALSE, conf.level = 0.95)

    Welch Two Sample t-test

data:  oss$collective and glob$collective
t = 1.9619, df = 7.8336, p-value = 0.04309
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 0.002858331         Inf
sample estimates:
mean of x mean of y 
0.3409869 0.2833103 

Score analysis by threat scale

POT99


  
  
  worldnews_graphs <- worldnews_environment_threat_level %>% 
  #filter(problem == "problem") %>% 
  select(title, threat_level, problem) %>%
  left_join(worldnews_posts,., by = c("title" = "title")) %>% 
  select(-(score)) %>%
  mutate(threat_level = case_when(
    problem == "Resolution" ~ "All Environmental Resolutions",
    !is.na(threat_level) ~ as.character(threat_level),
     star_system == "o" ~  "Outside Solar System",
    star_system == "i" ~  "Inside Solar System",
               TRUE~"All Other"
                                  ), 
         threat_level = factor(threat_level,threat_levels2)) %>% left_join(pronoun_use_post,., by = c("title" = "title")) %>% filter(!is.na(threat_level))





worldnews_graphs2 <- worldnews_graphs %>% group_by(title) %>% summarise(score_avg = mean(score)) %>% ungroup() %>% 
 left_join(worldnews_graphs,., by = c("title" = "title")) %>% mutate(score_ratio =
             score/(score -2*(score-score_avg))                         
              ) %>%
  filter(collective.x == "Contains collective")

    ggplot(worldnews_graphs2,
       aes(threat_level,score_ratio, size = num_comments.x))+ geom_boxplot(outlier.alpha = 0) + 
  geom_jitter(width=.25,alpha = 0.2)  +
  theme_classic() +  labs(title = "Score Ratio between comments with Collective Pronouns and Without in Posts from /r/worldnews by Scale of Threat/Resolution",
       subtitle = "all posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
       caption = "") + geom_hline(yintercept = 1) + theme_classic(base_size = 12) +xlab("") + ylab("Score ratio between comments with and without collective pronouns for each post") +scale_y_continuous(limits = c(0,4)) + theme(axis.text=element_text(size=8))
  
## hypothesis testing
    worldnews_graphs2 %>%
  group_by(problem,threat_level) %>%
  summarise(
    total_comments = sum(num_comments.x),
    collective_avg = sum(collective*num_comments)/total_comments,
    individual_avg = sum(individual*num_comments)/total_comments,
    col_min =collective_avg + sqrt(collective_avg*(1-collective_avg)/total_comments),
    col_max =collective_avg - sqrt(collective_avg*(1-collective_avg)/total_comments)
  )
  
  
  #only environmental
  
  worldnews_graphs %>% group_by(title) %>% summarise(score_avg = mean(score)) %>% ungroup() %>% 
 left_join(worldnews_graphs,., by = c("title" = "title")) %>% mutate(score_ratio = score/score_avg) %>%
    filter(climate_change == "related") %>%
    ggplot(
       aes(threat_level,score_ratio, size = num_comments.x))+ geom_boxplot(outlier.alpha = 0) + 
  geom_jitter(width=.25,alpha = 0.2) + facet_grid(~collective.x) +
  theme_classic() + labs(title = "Score Ratio between comments with Collective Pronouns and Without in Posts from /r/worldnews by Scale of Threat/Resolution",
       subtitle = "all posts from 2016 with at least 500 comments, each circle represents a post scaled by number of comments",
       caption = "") + geom_hline(yintercept = 1) + theme_classic() +xlab("") + ylab("Average score ratio between comments with and without collective pronouns") 
  

HYPOTHESIS TESTING

LS0tCnRpdGxlOiAiMDZfcG9zdF90b3BpY19hbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9Cgpwcm9ub3VuX3VzZV9wb3N0IDwtIHByb25vdW5fdXNlX2J5X2RvbmFsZF9wb3N0cyAlPiUKICBtdXRhdGUoaWQgPSBzdHJfc3ViKGxpbmtfaWQsc3RhcnQgPSAtNikpICU+JQogIGxlZnRfam9pbihmaWx0ZXIocG9zdHNfaW5fZG9uYWxkLCBudW1fY29tbWVudHMgPiA5KSxieSA9IGMoImlkIiA9ICJpZCIpKSAlPiUKICB0cmFuc211dGUoCiAgICAgICAgICAgIG51bV9jb21tZW50cz1udW1fY29tbWVudHMueCwKICAgICAgICAgICAgY29sbGVjdGl2ZT1jb2xsZWN0aXZlLAogICAgICAgICAgICBpbmRpdmlkdWFsPWluZGl2aWR1YWwsCiAgICAgICAgICAgIGNvbnRhaW5zX3dlID0gY29udGFpbnNfd2UsCiAgICAgICAgICAgIHRpdGxlPXRpdGxlLAogICAgICAgICAgICBzZWxmdGV4dD1zZWxmdGV4dCwKICAgICAgICAgICAgZG9tYWluPWRvbWFpbiwKICAgICAgICAgICAgc2VsZnBvc3Q9aWZlbHNlKGlzLm5hKHNlbGZ0ZXh0KSwiTm90IFNlbGYgUG9zdCIsICJTZWxmIFBvc3QiKSwKICAgICAgICAgICAgc2NvcmU9c2NvcmUsCiAgICAgICAgICAgIGNyZWF0ZWRfdXRjID0gY3JlYXRlZF91dGMsCiAgICAgICAgICAgIGRhdGUgPSBhcy5QT1NJWGN0KGNyZWF0ZWRfdXRjLHR6PSIiLCBvcmlnaW49IjE5NzAtMDEtMDEiKQogICAgICAgICAgICApICU+JSBmaWx0ZXIoIyFpcy5uYShjb2xsZWN0aXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50cyA+IDUwMCkKCmNvbFN1bXMoaXMubmEocHJvbm91bl91c2VfcG9zdCkpCgpgYGAKCgpNb3N0IGFuZCBsZWFzdCBjb2xsZWN0aXZlIHBvc3RzCmBgYHtyfQpwcm9ub3VuX3VzZV9wb3N0ICU+JQogIGZpbHRlcihudW1fY29tbWVudHMgPiA1MDApICU+JQogIGFycmFuZ2UoKGNvbGxlY3RpdmUpKSAjJT4lIGhlYWQoMTAwKQpgYGAKCmBgYHtyfQpwcm9ub3VuX3VzZV9wb3N0ICU+JQogIGZpbHRlcihudW1fY29tbWVudHMgPiAxMDApICU+JQogIGdncGxvdCgpKwogIGdlb21fZGVuc2l0eShhZXMoY29sbGVjdGl2ZSkpCmBgYAoKIyNQT1Q4CiMjUGFydGljdWxhciB3b3JkcyBpbiB0aGUgdGl0bGUgb2YgdGhlIHBvc3QKYGBge3J9CnByb25vdW5fdXNlX3Bvc3QgJT4lCiAgZmlsdGVyKG51bV9jb21tZW50cyA+IDEwMCkgJT4lCiAgbXV0YXRlKGNvbnRhaW5zX3dvcmQgPSAKICAgICAgICBpZmVsc2UoCiAgICAgIGdyZXBsKCJURCIsICh0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ0X2QiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRoZV9kb25hbGQiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICNncmVwbCgiY2Vuc29yIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCJlbnZpcm9ubWVudCIsIHRvbG93ZXIodGl0bGUpKSB8CiAgICAgICNncmVwbCgiaWNlIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCIiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICwiY2xpbWF0ZSByZWxhdGVkIiwgInVucmVsYXRlZCIKICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUKbXV0YXRlKHNlbGZfcG9zdCA9IGlmZWxzZShpcy5uYShzZWxmdGV4dCksIm5vIiwieWVzIikpICU+JQogIGdyb3VwX2J5KGNvbnRhaW5zX3dvcmQpICU+JQogIHN1bW1hcmlzZSgKICAgIGNvbGxlY3RpdmVfd2VpZ2h0ZWQgPSBzdW0obnVtX2NvbW1lbnRzKmNvbGxlY3RpdmUpL3N1bShudW1fY29tbWVudHMpLAogICAgY29sbGVjdGl2ZSA9ICBtZWFuKGNvbGxlY3RpdmUpLAogICAgbnVtX3Bvc3RzICA9IG4oKSwKICAgIHRvdGFsX2NvbW1lbnRzID0gc3VtKG51bV9jb21tZW50cykKICApCiAgI2dncGxvdCgpKwogICNnZW9tX2JveHBsb3QoYWVzKGNvbnRhaW5zX3dvcmQsY29sbGVjdGl2ZSkpCgoKCmBgYAoKIyMgVGltZSBzZXJpZXMgYW5hbHlzaXMKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKCmdncGxvdGx5KAogIGdncGxvdChmaWx0ZXIocHJvbm91bl91c2VfcG9zdCxudW1fY29tbWVudHMgPjE1MCkgLGFlcyhkYXRlLGNvbGxlY3RpdmUsc2l6ZSA9IG51bV9jb21tZW50cywgbmFtZSA9IHRpdGxlLCBjb2xvciA9IHNlbGZwb3N0KSkrCiAgZ2VvbV9wb2ludCgpCikKYGBgCgoKIyMgQUxMIFBPTElUSUNBTCBTVUJSRURESVRTCgpgYGB7cn0KcHJvbm91bl91c2VfcG9zdCA8LSBwcm9ub3VuX3VzZV9ieV9wb2xpdGljYWxfcG9zdHMgJT4lCiAgbXV0YXRlKGlkID0gc3RyX3N1YihsaW5rX2lkLHN0YXJ0ID0gLTYpKSAlPiUKICBsZWZ0X2pvaW4oZmlsdGVyKHBvc3RzX2luX3BvbGl0aWNhbF9zdWJzLCBudW1fY29tbWVudHMgPiA5KSxieSA9IGMoImlkIiA9ICJpZCIsICJzdWJyZWRkaXQiID0gInN1YnJlZGRpdCIpICklPiUKICB0cmFuc211dGUoc3VicmVkZGl0ID0gc3VicmVkZGl0LAogICAgICAgICAgICBudW1fY29tbWVudHM9bnVtX2NvbW1lbnRzLngsCiAgICAgICAgICAgIGNvbGxlY3RpdmU9Y29sbGVjdGl2ZSwKICAgICAgICAgICAgaW5kaXZpZHVhbD1pbmRpdmlkdWFsLAogICAgICAgICAgICBjb2xfbWluX2luZCA9IGNvbnRhaW5zX3dlIC0gaW5kaXZpZHVhbCwKICAgICAgICAgICAgY29udGFpbnNfd2UgPSBjb250YWluc193ZSwKICAgICAgICAgICAgdGl0bGU9dGl0bGUsCiAgICAgICAgICAgIGZ1bGxfdGl0bGUgPSBwYXN0ZShzdWJyZWRkaXQsdGl0bGUsIHNlcD0iOiAiKSwKICAgICAgICAgICAgc2VsZnRleHQ9c2VsZnRleHQsCiAgICAgICAgICAgIGRvbWFpbj1kb21haW4sCiAgICAgICAgICAgIHNlbGZwb3N0PWlmZWxzZShpcy5uYShzZWxmdGV4dCksIk5vdCBTZWxmIFBvc3QiLCAiU2VsZiBQb3N0IiksCiAgICAgICAgICAgIHNjb3JlPXNjb3JlLAogICAgICAgICAgICBjcmVhdGVkX3V0YyA9IGNyZWF0ZWRfdXRjLAogICAgICAgICAgICBkYXRlID0gYXMuUE9TSVhjdChjcmVhdGVkX3V0Yyx0ej0iIiwgb3JpZ2luPSIxOTcwLTAxLTAxIiksCiAgICAgICAgICAgIGNsaW1hdGVfY2hhbmdlID0gaWZlbHNlKAogICAgZ3JlcGwoImNsaW1hdGUiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRlbXBlcmF0dXJlIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgICNncmVwbCgicG9sbHV0aW9uIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ3YXJtaW5nIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgZ3JlcGwoImVudmlyb25tZW50IiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgI2dyZXBsKCJpY2UiLCB0b2xvd2VyKHRpdGxlKSkgfAogICAgICBncmVwbCgiZW52aXJvbm1lbnQiLCB0b2xvd2VyKHRpdGxlKSkgCiAgICAgICwiY2xpbWF0ZSByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIHRocmVhdCA9IGlmZWxzZSgKICAgIGdyZXBsKCJ0aHJlYXQiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoImV4dGluY3QiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoIndhcm5zIiwgdG9sb3dlcih0aXRsZSkpIAogICAgICAsInRocmVhdCByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIGFsaWVucyA9IGlmZWxzZSgKICAgIGdyZXBsKCJhbGllbiIsIHRvbG93ZXIodGl0bGUpKQogICAgICAKICAgICAgLCJhbGllbiByZWxhdGVkIiwgInVucmVsYXRlZCIKICApLAogIGFueV9vZl90aHJlZSA9IGlmZWxzZSgKICAgICBjbGltYXRlX2NoYW5nZSA9PSAiY2xpbWF0ZSByZWxhdGVkInwgCiAgICAgIHRocmVhdCA9PSAidGhyZWF0IHJlbGF0ZWQiIHwKICAgICAgYWxpZW5zID09ICJhbGllbiByZWxhdGVkIgogICAgICAsImFueSBvZiAzIHJlbGF0ZWQiLCAidW5yZWxhdGVkIgogICkKICAgICAgICAgICAgKSAlPiUgZmlsdGVyKCMhaXMubmEoY29sbGVjdGl2ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHMgPiA1MCkgJT4lCiAgbGVmdF9qb2luKHJlYWRfY3N2KCJzdWJyZWRkaXRfY2F0ZWdvcmllcy5jc3YiKSwgYnkgPSBjKCJzdWJyZWRkaXQiID0gInN1YnJlZGRpdCIpKQoKY29sU3Vtcyhpcy5uYShwcm9ub3VuX3VzZV9wb3N0KSkKCmBgYAoKYGBge3J9CmxpYnJhcnkocGxvdGx5KQpnZ3Bsb3RseSgKICBnZ3Bsb3QoZmlsdGVyKHByb25vdW5fdXNlX3Bvc3QsbnVtX2NvbW1lbnRzID41MDAsIHN1YnJlZGRpdCA9PSAiVGhlX0RvbmFsZCIpICxhZXMoZGF0ZSxjb2xsZWN0aXZlLHNpemUgPSBudW1fY29tbWVudHMsIG5hbWUgPSBmdWxsX3RpdGxlLCBjb2xvciA9IGNsaW1hdGVfY2hhbmdlKSkrCiAgZ2VvbV9wb2ludCgpCikKYGBgCmBgYHtyfQpmaWx0ZXIocHJvbm91bl91c2VfcG9zdCxudW1fY29tbWVudHMgPjUwMCwgc3VicmVkZGl0ID09ICJ3b3JsZG5ld3MiKSAlPiUgCiAgbXV0YXRlKGNsaW1hdGVfY2hhbmdlID0gaWZlbHNlKAogICAgZ3JlcGwoImNsaW1hdGUiLCB0b2xvd2VyKHRpdGxlKSkgfCAKICAgICAgZ3JlcGwoInRlbXBlcmF0dXJlIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgICNncmVwbCgicG9sbHV0aW9uIiwgdG9sb3dlcih0aXRsZSkpIHwgCiAgICAgIGdyZXBsKCJ3YXJtaW5nIiwgdG9sb3dlcih0aXRsZSkpIHwKICAgICAgZ3JlcGwoImVudmlyb25tZW50IiwgdG9sb3dlcih0aXRsZSkpIAogICAgICAsImNsaW1hdGUgcmVsYXRlZCIsICJ1bnJlbGF0ZWQiCiAgKQogICAgKSAlPiUKICBhcnJhbmdlKGRlc2MoY29sX21pbl9pbmQpKSAlPiUgaGVhZCg1MCkKYGBgCiMjIHdvcmxkbmV3cwoKIyMgQUxMIFBPTElUSUNBTCBTVUJSRURESVRTCgpgYGB7cn0KcHJvbm91bl91c2VfcG9zdCA8LSBwcm9ub3VuX3VzZV9ieV93b3JsZG5ld3MyMDE2X3Bvc3RzICU+JQogIG11dGF0ZShpZCA9IHN0cl9zdWIobGlua19pZCxzdGFydCA9IC02KSkgJT4lCiAgbGVmdF9qb2luKGZpbHRlcihwb3N0c19pbl9wb2xpdGljYWxfc3Vicywgc3VicmVkZGl0ID09ICJ3b3JsZG5ld3MiKSxieSA9IGMoImlkIiA9ICJpZCIgKSklPiUKICB0cmFuc211dGUoc3VicmVkZGl0ID0gc3VicmVkZGl0LAogICAgICAgICAgICBudW1fY29tbWVudHM9bnVtX2NvbW1lbnRzLngsCiAgICAgICAgICAgIGNvbGxlY3RpdmUgPSBjb2xsZWN0aXZlLAogICAgICAgICAgICBzY29yZSA9IHNjb3JlLngsCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAKICAgICAgICAgICAgdGl0bGU9dGl0bGUsCiAgICAgICAgICAgIAogICAgICAgICAgICBzZWxmdGV4dD1zZWxmdGV4dCwKICAgICAgICAgICAgZG9tYWluPWRvbWFpbiwKICAgICAgICAgICAgc2VsZnBvc3Q9aWZlbHNlKGlzLm5hKHNlbGZ0ZXh0KSwiTm90IFNlbGYgUG9zdCIsICJTZWxmIFBvc3QiKSwKICAgICAgICAgICAgCiAgICAgICAgICAgIGNyZWF0ZWRfdXRjID0gY3JlYXRlZF91dGMsCiAgICAgICAgICAgIGRhdGUgPSBhcy5QT1NJWGN0KGNyZWF0ZWRfdXRjLHR6PSIiLCBvcmlnaW49IjE5NzAtMDEtMDEiKSkgJT4lIAogICAgICAgICAgICBmaWx0ZXIoIyFpcy5uYShjb2xsZWN0aXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50cyA+IDUwKSAlPiUKICBsZWZ0X2pvaW4ocmVhZF9jc3YoInN1YnJlZGRpdF9jYXRlZ29yaWVzLmNzdiIpLCBieSA9IGMoInN1YnJlZGRpdCIgPSAic3VicmVkZGl0IikpCgpjb2xTdW1zKGlzLm5hKHByb25vdW5fdXNlX3Bvc3QpKQoKYGBgCgoKCgojIyByZWcgd29ybGRuZXdzCmBgYHtyfQp3b3JsZG5ld3NfcG9zdHMgPC0gcmVhZF9kZWxpbSgid29ybGRuZXdzX2Vudmlyb25tZW50YWxfcG9zdHMgLSB3b3JsZG5ld3NfcG9zdHMudHN2IiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUKICBtdXRhdGUodGhyZWF0X3Njb3JlID0gY2FzZV93aGVuKAogICAgdGhyZWF0X3Njb3JlID09ICJlIiB+ICJFbnZpcm9ubWVudGFsIFJlbGF0ZWQiLAogICAgdGhyZWF0X3Njb3JlID09ICJhIiB+ICJBbGllbi9TcGFjZSB0cmF2ZWwgUmVsYXRlZCIsCiAgICBUUlVFIH4gIk90aGVyIgogICAgCiAgKSkgICU+JSBmaWx0ZXIoIWlzLm5hKHRpdGxlKSkKYGBgCiMjUE9UIDcKYGBge3J9CmxpYnJhcnkocGxvdGx5KQojZ2dwbG90bHkoCiAgZ2dwbG90KHdvcmxkbmV3c19wb3N0cyAsYWVzKGRhdGUsY29sbGVjdGl2ZSxzaXplID0gbnVtX2NvbW1lbnRzLCBuYW1lID0gZnVsbF90aXRsZSwgY29sb3IgPSB0aHJlYXRfc2NvcmUpKSsKICBnZW9tX3BvaW50KCkrCiAgICB0aGVtZV9jbGFzc2ljKCkrCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoKQogICAgICAgICAgICAgICAgICAKIykKCgp3b3JsZG5ld3NfcG9zdHMgJT4lIGdyb3VwX2J5KHRocmVhdF9zY29yZSkgJT4lIHN1bW1hcmlzZSgKICBudW1iZXJfb2ZfcG9zdHMgPSBuKCksCiAgYXZnX2NvbGxlY3RpdmUgPSBtZWFuKGNvbGxlY3RpdmUpLAogIGF2Z19pbmRpdmlkdWFsID0gbWVhbihpbmRpdmlkdWFsKQopCmdncGxvdChtdXRhdGUod29ybGRuZXdzX3Bvc3RzLGNvbF9wY3QgPSAxMDAqY29sbGVjdGl2ZSkgLGFlcyh0aHJlYXRfc2NvcmUsY29sX3BjdCxzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdCgpICsgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjEpICsgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikrCiAgICAgICBsYWJzKHRpdGxlID0gIkNvbGxlY3RpdmUgUHJvbm91biBVc2UgYnkgVG9waWMgaW4gcG9zdHMgZnJvbSAvci93b3JsZG5ld3MiLAogICAgICAgc3VidGl0bGUgPSAiQWxsIHBvc3RzIGZyb20gMjAxNiB3aXRoIGF0IGxlYXN0IDUwMCBjb21tZW50cywgZWFjaCBjaXJjbGUgcmVwcmVzZW50cyBhIHBvc3Qgc2NhbGVkIGJ5IG51bWJlciBvZiBjb21tZW50cyIsCiAgICAgICBjYXB0aW9uID0gIiIpICsgeGxhYigiIikrIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgQ29tbWVudHMgd2hpY2ggY29udGFpbnMgQ29sbGVjdGl2ZSBQcm9ub3VucyIpIAogICAgICAgCmdncGxvdCh3b3JsZG5ld3NfcG9zdHMgLGFlcyh0aHJlYXRfc2NvcmUsaW5kaXZpZHVhbCxzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdCgpIAoKCgojd29ybGRuZXdzX3Bvc3RzICU+JSBmaWx0ZXIodGhyZWF0X3Njb3JlID09ICJFbnZpcm9ubWVudGFsIFJlbGF0ZWQiKSAlPiUgYXJyYW5nZShkZXNjKGNvbGxlY3RpdmUpKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUsdGl0bGUsIG51bV9jb21tZW50cywgaW5kaXZpZHVhbCxjb250YWluc193ZSxkYXRlKSAlPiUgd3JpdGVfY3N2KCJ3b3JsZG5ld3NfZW52aXJvbm1lbnQyLmNzdiIpCmBgYAoKCmBgYHtyfQp0aHJlYXRfbGV2ZWxzIDwtIGMoIlBlcnNvbi9QbGFjZS9CdXNpbmVzcyIsCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIkNvdW50cnkiLAogICAgICAgICAgICAgICAgICAgIlJlaWdvbmFsIiwKICAgICAgICAgICAgICAgICAgICJHbG9iYWwiCgoKKQoKdGhyZWF0X2xldmVsczIgPC0gYygiQWxsIE90aGVyIiwKICAgICAgICAgICAgICAgICAgICAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgICAgICAgICAgICAgICAgICJQZXJzb24vUGxhY2UvQnVzaW5lc3MiLAogICAgICAgICAgICAgICAgICAgIkNvdW50cnkiLAogICAgICAgICAgICAgICAgICAgIlJlaWdvbmFsIiwKICAgICAgICAgICAgICAgICAgICJHbG9iYWwiLAogICAgICAgICAgICAgICAgICAgIkluc2lkZSBTb2xhciBTeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgIk91dHNpZGUgU29sYXIgU3lzdGVtIgoKCikKCndvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwgPC0gcmVhZF9kZWxpbSgid29ybGRuZXdzX2Vudmlyb25tZW50Ml90aHJlYXRfbGV2ZWwudHN2IiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgbXV0YXRlKHRocmVhdF9sZXZlbCA9IGNhc2Vfd2hlbigKICAgIHRocmVhdF9sZXZlbCA9PSAiZSIgfiAiR2xvYmFsIiwKICAgIHRocmVhdF9sZXZlbCA9PSAiYyIgfiAiQ291bnRyeSIsCiAgICB0aHJlYXRfbGV2ZWwgPT0gImIiIHwKICAgIHRocmVhdF9sZXZlbCA9PSAicyIgfiAiUGVyc29uL1BsYWNlL0J1c2luZXNzIiwKICAgIHRocmVhdF9sZXZlbCA9PSAiciIgfiAiUmVpZ29uYWwiLAogICAgVFJVRSB+ICJPdGhlciIpLAogICAgcHJvYmxlbSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSA9PSAibiIgfiAiUmVzb2x1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVGhyZWF0IiksCiAgICAgICAgICAgICAgICAgICAKICAgIHRocmVhdF9sZXZlbCA9IGZhY3Rvcih0aHJlYXRfbGV2ZWwsdGhyZWF0X2xldmVscyksCiAgICBjb2xfcGN0PWNvbGxlY3RpdmUqMTAwKQoKZ2dwbG90KHdvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwsCiAgICAgICBhZXModGhyZWF0X2xldmVsLGNvbF9wY3Qsc2l6ZSA9IG51bV9jb21tZW50cykpKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKHdpZHRoPS4yLGFscGhhID0gMC41KSArIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpICsgZmFjZXRfd3JhcCh+cHJvYmxlbSkgKwogIGxhYnModGl0bGUgPSAiQ29sbGVjdGl2ZSBQcm9ub3VuIFVzZSBieSBUaHJlYXQgU3RhdHVzIGFuZCBTY2FsZSBpbiBwb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJhbGwgcG9zdHMgZnJvbSAyMDE2IHdpdGggYXQgbGVhc3QgNTAwIGNvbW1lbnRzLCBlYWNoIGNpcmNsZSByZXByZXNlbnRzIGEgcG9zdCBzY2FsZWQgYnkgbnVtYmVyIG9mIGNvbW1lbnRzIiwKICAgICAgIGNhcHRpb24gPSAiIikgKyB4bGFiKCJTY2FsZSBvZiBFbnZpcm9ubWVudGFsIFRocmVhdC9SZXNvbHV0aW9uIikgKyB5bGFiKCJQZXJjZW50YWdlIG9mIENvbW1lbnRzIHdoaWNoIGNvbnRhaW5zIENvbGxlY3RpdmUgUHJvbm91bnMiKSAKI2dncGxvdCh3b3JsZG5ld3NfZW52aXJvbm1lbnRfdGhyZWF0X2xldmVsLAojICAgICAgIGFlcyhwcm9ibGVtLGNvbnRhaW5zX3dlLHNpemUgPSBudW1fY29tbWVudHMpKSsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcih3aWR0aD0uMixhbHBoYSA9IDAuNSkgKyAjdGhlbWVfY2xhc3NpYygpICsgZmFjZXRfZ3JpZCh+dGhyZWF0X2xldmVsKQoKd29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCAlPiUKICBncm91cF9ieShwcm9ibGVtLHRocmVhdF9sZXZlbCkgJT4lCiAgc3VtbWFyaXNlKAogICAgdG90YWxfY29tbWVudHMgPSBzdW0obnVtX2NvbW1lbnRzKSwKICAgIGNvbGxlY3RpdmVfYXZnID0gc3VtKGNvbGxlY3RpdmUqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGluZGl2aWR1YWxfYXZnID0gc3VtKGluZGl2aWR1YWwqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGNvbF9taW4gPWNvbGxlY3RpdmVfYXZnICsgc3FydChjb2xsZWN0aXZlX2F2ZyooMS1jb2xsZWN0aXZlX2F2ZykvdG90YWxfY29tbWVudHMpLAogICAgY29sX21heCA9Y29sbGVjdGl2ZV9hdmcgLSBzcXJ0KGNvbGxlY3RpdmVfYXZnKigxLWNvbGxlY3RpdmVfYXZnKS90b3RhbF9jb21tZW50cykKICApCgpnZ3Bsb3Qod29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCwKICAgICAgIGFlcyhudW1fY29tbWVudHMsY29sbGVjdGl2ZSkpKyBnZW9tX3BvaW50KCkgKyBzY2FsZV94X2xvZzEwKCkKCndvcmxkbmV3c19ncmFwaHMgPC0gd29ybGRuZXdzX2Vudmlyb25tZW50X3RocmVhdF9sZXZlbCAlPiUgCiAgI2ZpbHRlcihwcm9ibGVtID09ICJwcm9ibGVtIikgJT4lIAogIHNlbGVjdCh0aXRsZSwgdGhyZWF0X2xldmVsLCBwcm9ibGVtKSAlPiUKICBsZWZ0X2pvaW4od29ybGRuZXdzX3Bvc3RzLC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSAKICBtdXRhdGUodGhyZWF0X2xldmVsID0gY2FzZV93aGVuKAogICAgcHJvYmxlbSA9PSAiUmVzb2x1dGlvbiIgfiAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgIWlzLm5hKHRocmVhdF9sZXZlbCkgfiBhcy5jaGFyYWN0ZXIodGhyZWF0X2xldmVsKSwKICAgICBzdGFyX3N5c3RlbSA9PSAibyIgfiAgIk91dHNpZGUgU29sYXIgU3lzdGVtIiwKICAgIHN0YXJfc3lzdGVtID09ICJpIiB+ICAiSW5zaWRlIFNvbGFyIFN5c3RlbSIsCiAgICAgICAgICAgICAgIFRSVUV+IkFsbCBPdGhlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIAogICAgICAgICB0aHJlYXRfbGV2ZWwgPSBmYWN0b3IodGhyZWF0X2xldmVsLHRocmVhdF9sZXZlbHMyKSwKICAgIGNvbF9wY3QgPSBjb2xsZWN0aXZlKjEwMCkgCiAKICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBocywKICAgICAgIGFlcyh0aHJlYXRfbGV2ZWwsY29sX3BjdCwgc2l6ZSA9IG51bV9jb21tZW50cykpKyBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDApICsgCiAgZ2VvbV9qaXR0ZXIod2lkdGg9LjI1LGFscGhhID0gMC4yKSArIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpICsgbGFicyh0aXRsZSA9ICJDb2xsZWN0aXZlIFByb25vdW4gVXNlIGluIFBvc3RzIGZyb20gL3Ivd29ybGRuZXdzIGJ5IFNjYWxlIG9mIFRocmVhdC9SZXNvbHV0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSBvZiBDb21tZW50cyB3aGljaCBjb250YWlucyBDb2xsZWN0aXZlIFByb25vdW5zIikgK3RoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSkKICAKICAgIGdncGxvdCh3b3JsZG5ld3NfZ3JhcGhzLAogICAgICAgYWVzKHRocmVhdF9sZXZlbCxpbmRpdmlkdWFsLCBzaXplID0gbnVtX2NvbW1lbnRzKSkrIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMCkgKyAKICBnZW9tX2ppdHRlcih3aWR0aD0uMjUsYWxwaGEgPSAwLjIpICsgCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikgKyBsYWJzKHRpdGxlID0gIkluZGl2aWR1YWwgUHJvbm91biBVc2UgaW4gUG9zdHMgZnJvbSAvci93b3JsZG5ld3MgYnkgU2NhbGUgb2YgVGhyZWF0L1Jlc29sdXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiYWxsIHBvc3RzIGZyb20gMjAxNiB3aXRoIGF0IGxlYXN0IDUwMCBjb21tZW50cywgZWFjaCBjaXJjbGUgcmVwcmVzZW50cyBhIHBvc3Qgc2NhbGVkIGJ5IG51bWJlciBvZiBjb21tZW50cyIsCiAgICAgICBjYXB0aW9uID0gIiIpICsgeGxhYigiVGhyZWF0IFNjYWxlIikgKyB5bGFiKCJQcm9wb3J0aW9uIG9mIGNvbW1lbnRzIHdpdGggaW5kaXZpZHVhbCBwcm9ub3VucyIpK3RoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSkKCiAgbGlicmFyeShSQ29sb3JCcmV3ZXIpCiAgICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBocyAsYWVzKGRhdGUsY29sX3BjdCxzaXplID0gbnVtX2NvbW1lbnRzLCBuYW1lID0gZnVsbF90aXRsZSwgY29sb3IgPSB0aHJlYXRfbGV2ZWwpKSsKICBnZW9tX3BvaW50KCkrCiAgICB0aGVtZV9jbGFzc2ljKCkrCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoKSsKICAgICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSt0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE2KSArIGxhYnModGl0bGUgPSAiQ29sbGVjdGl2ZSBQcm9ub3VuIFVzZSBpbiBQb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyBieSBEYXRlIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIHhsYWIoIkRhdGUiKSArIHlsYWIoIlBlcmNlbnRhZ2Ugb2YgQ29tbWVudHMgd2hpY2ggY29udGFpbiBDb2xsZWN0aXZlIFByb25vdW5zIikKICAgIAogICAgICAgICAgICAgICAKICAKd29ybGRuZXdzX2dyYXBocyAlPiUKICBmaWx0ZXIodGhyZWF0X2xldmVsID09ICJBbGwgT3RoZXIiKSAlPiUgaGVhZCg1MCkKYGBgCgojI0h5cCB0ZXN0CmBgYHtyfQpwb3Bfc2RfY29sIDwtIHNkKHdvcmxkbmV3c19ncmFwaHMkY29sbGVjdGl2ZSkKcG9wX211X2NvbCA8LSBtZWFuKHdvcmxkbmV3c19ncmFwaHMkY29sbGVjdGl2ZSkKCnBvcF9zZF9pbmQgPC0gc2Qod29ybGRuZXdzX2dyYXBocyRpbmRpdmlkdWFsKQpwb3BfbXVfaW5kIDwtIG1lYW4od29ybGRuZXdzX2dyYXBocyRpbmRpdmlkdWFsKQoKd29ybGRuZXdzX2dyYXBocyAlPiUgZ3JvdXBfYnkodGhyZWF0X2xldmVsKSAlPiUgc3VtbWFyaXNlKAogIE4gPSBuKCksCiAgY29sbGVjdGl2ZV9hdmcgPSBtZWFuKGNvbGxlY3RpdmUpLAogIGluZGl2aWR1YWxfYXZnID0gbWVhbihpbmRpdmlkdWFsKSwKICAKICB0X3Njb3JlX2NvbCA9IChjb2xsZWN0aXZlX2F2ZyAtIHBvcF9tdV9jb2wpKnNxcnQoTikvcG9wX3NkX2NvbCwKICB0X3Njb3JlX2luZCA9IChpbmRpdmlkdWFsX2F2ZyAtIHBvcF9tdV9pbmQpKnNxcnQoTikvcG9wX3NkX2luZCwKICAKICBwX2NvbCA9IHB0KC1hYnModF9zY29yZV9jb2wpLGRmPU4tMSksCiAgcF9pbmQgPSBwdCgtYWJzKHRfc2NvcmVfaW5kKSxkZj1OLTEpCikKCnJlc28gPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCnBwYiA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJQZXJzb24vUGxhY2UvQnVzaW5lc3MiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCmNvdW50cnkgPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiQ291bnRyeSIpICU+JSBzZWxlY3QoY29sbGVjdGl2ZSkKcmVpZyA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJSZWlnb25hbCIpICU+JSBzZWxlY3QoY29sbGVjdGl2ZSkKZ2xvYiA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJHbG9iYWwiKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCmlzcyA8LSBmaWx0ZXIod29ybGRuZXdzX2dyYXBocywgdGhyZWF0X2xldmVsID09ICJJbnNpZGUgU29sYXIgU3lzdGVtIikgJT4lIHNlbGVjdChjb2xsZWN0aXZlKQpvc3MgPC0gZmlsdGVyKHdvcmxkbmV3c19ncmFwaHMsIHRocmVhdF9sZXZlbCA9PSAiT3V0c2lkZSBTb2xhciBTeXN0ZW0iKSAlPiUgc2VsZWN0KGNvbGxlY3RpdmUpCgoKdC50ZXN0KG9zcyRjb2xsZWN0aXZlLGdsb2IkY29sbGVjdGl2ZSwgYWx0ZXJuYXRpdmUgPSAgImdyZWF0ZXIiLCBtdSA9IDAsIAogICAgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLCBjb25mLmxldmVsID0gMC45NSkKYGBgCgoKIyMgU2NvcmUgYW5hbHlzaXMgYnkgdGhyZWF0IHNjYWxlCiMjIFBPVDk5CmBgYHtyfQoKICAKICAKICB3b3JsZG5ld3NfZ3JhcGhzIDwtIHdvcmxkbmV3c19lbnZpcm9ubWVudF90aHJlYXRfbGV2ZWwgJT4lIAogICNmaWx0ZXIocHJvYmxlbSA9PSAicHJvYmxlbSIpICU+JSAKICBzZWxlY3QodGl0bGUsIHRocmVhdF9sZXZlbCwgcHJvYmxlbSkgJT4lCiAgbGVmdF9qb2luKHdvcmxkbmV3c19wb3N0cywuLCBieSA9IGMoInRpdGxlIiA9ICJ0aXRsZSIpKSAlPiUgCiAgc2VsZWN0KC0oc2NvcmUpKSAlPiUKICBtdXRhdGUodGhyZWF0X2xldmVsID0gY2FzZV93aGVuKAogICAgcHJvYmxlbSA9PSAiUmVzb2x1dGlvbiIgfiAiQWxsIEVudmlyb25tZW50YWwgUmVzb2x1dGlvbnMiLAogICAgIWlzLm5hKHRocmVhdF9sZXZlbCkgfiBhcy5jaGFyYWN0ZXIodGhyZWF0X2xldmVsKSwKICAgICBzdGFyX3N5c3RlbSA9PSAibyIgfiAgIk91dHNpZGUgU29sYXIgU3lzdGVtIiwKICAgIHN0YXJfc3lzdGVtID09ICJpIiB+ICAiSW5zaWRlIFNvbGFyIFN5c3RlbSIsCiAgICAgICAgICAgICAgIFRSVUV+IkFsbCBPdGhlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIAogICAgICAgICB0aHJlYXRfbGV2ZWwgPSBmYWN0b3IodGhyZWF0X2xldmVsLHRocmVhdF9sZXZlbHMyKSkgJT4lIGxlZnRfam9pbihwcm9ub3VuX3VzZV9wb3N0LC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSBmaWx0ZXIoIWlzLm5hKHRocmVhdF9sZXZlbCkpCgoKCgoKd29ybGRuZXdzX2dyYXBoczIgPC0gd29ybGRuZXdzX2dyYXBocyAlPiUgZ3JvdXBfYnkodGl0bGUpICU+JSBzdW1tYXJpc2Uoc2NvcmVfYXZnID0gbWVhbihzY29yZSkpICU+JSB1bmdyb3VwKCkgJT4lIAogbGVmdF9qb2luKHdvcmxkbmV3c19ncmFwaHMsLiwgYnkgPSBjKCJ0aXRsZSIgPSAidGl0bGUiKSkgJT4lIG11dGF0ZShzY29yZV9yYXRpbyA9CiAgICAgICAgICAgICBzY29yZS8oc2NvcmUgLTIqKHNjb3JlLXNjb3JlX2F2ZykpICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICkgJT4lCiAgZmlsdGVyKGNvbGxlY3RpdmUueCA9PSAiQ29udGFpbnMgY29sbGVjdGl2ZSIpCgoKCiAgICBnZ3Bsb3Qod29ybGRuZXdzX2dyYXBoczIsCiAgICAgICBhZXModGhyZWF0X2xldmVsLHNjb3JlX3JhdGlvLCBzaXplID0gbnVtX2NvbW1lbnRzLngpKSsgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwKSArIAogIGdlb21faml0dGVyKHdpZHRoPS4yNSxhbHBoYSA9IDAuMikgICsKICB0aGVtZV9jbGFzc2ljKCkgKyAgbGFicyh0aXRsZSA9ICJTY29yZSBSYXRpbyBiZXR3ZWVuIGNvbW1lbnRzIHdpdGggQ29sbGVjdGl2ZSBQcm9ub3VucyBhbmQgV2l0aG91dCBpbiBQb3N0cyBmcm9tIC9yL3dvcmxkbmV3cyBieSBTY2FsZSBvZiBUaHJlYXQvUmVzb2x1dGlvbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJhbGwgcG9zdHMgZnJvbSAyMDE2IHdpdGggYXQgbGVhc3QgNTAwIGNvbW1lbnRzLCBlYWNoIGNpcmNsZSByZXByZXNlbnRzIGEgcG9zdCBzY2FsZWQgYnkgbnVtYmVyIG9mIGNvbW1lbnRzIiwKICAgICAgIGNhcHRpb24gPSAiIikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxKSArIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTIpICt4bGFiKCIiKSArIHlsYWIoIlNjb3JlIHJhdGlvIGJldHdlZW4gY29tbWVudHMgd2l0aCBhbmQgd2l0aG91dCBjb2xsZWN0aXZlIHByb25vdW5zIGZvciBlYWNoIHBvc3QiKSArc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw0KSkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9OCkpCiAgCiMjIGh5cG90aGVzaXMgdGVzdGluZwogICAgd29ybGRuZXdzX2dyYXBoczIgJT4lCiAgZ3JvdXBfYnkocHJvYmxlbSx0aHJlYXRfbGV2ZWwpICU+JQogIHN1bW1hcmlzZSgKICAgIHRvdGFsX2NvbW1lbnRzID0gc3VtKG51bV9jb21tZW50cy54KSwKICAgIGNvbGxlY3RpdmVfYXZnID0gc3VtKGNvbGxlY3RpdmUqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGluZGl2aWR1YWxfYXZnID0gc3VtKGluZGl2aWR1YWwqbnVtX2NvbW1lbnRzKS90b3RhbF9jb21tZW50cywKICAgIGNvbF9taW4gPWNvbGxlY3RpdmVfYXZnICsgc3FydChjb2xsZWN0aXZlX2F2ZyooMS1jb2xsZWN0aXZlX2F2ZykvdG90YWxfY29tbWVudHMpLAogICAgY29sX21heCA9Y29sbGVjdGl2ZV9hdmcgLSBzcXJ0KGNvbGxlY3RpdmVfYXZnKigxLWNvbGxlY3RpdmVfYXZnKS90b3RhbF9jb21tZW50cykKICApCiAgCiAgCiAgI29ubHkgZW52aXJvbm1lbnRhbAogIAogIHdvcmxkbmV3c19ncmFwaHMgJT4lIGdyb3VwX2J5KHRpdGxlKSAlPiUgc3VtbWFyaXNlKHNjb3JlX2F2ZyA9IG1lYW4oc2NvcmUpKSAlPiUgdW5ncm91cCgpICU+JSAKIGxlZnRfam9pbih3b3JsZG5ld3NfZ3JhcGhzLC4sIGJ5ID0gYygidGl0bGUiID0gInRpdGxlIikpICU+JSBtdXRhdGUoc2NvcmVfcmF0aW8gPSBzY29yZS9zY29yZV9hdmcpICU+JQogICAgZmlsdGVyKGNsaW1hdGVfY2hhbmdlID09ICJyZWxhdGVkIikgJT4lCiAgICBnZ3Bsb3QoCiAgICAgICBhZXModGhyZWF0X2xldmVsLHNjb3JlX3JhdGlvLCBzaXplID0gbnVtX2NvbW1lbnRzLngpKSsgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwKSArIAogIGdlb21faml0dGVyKHdpZHRoPS4yNSxhbHBoYSA9IDAuMikgKyBmYWNldF9ncmlkKH5jb2xsZWN0aXZlLngpICsKICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gIlNjb3JlIFJhdGlvIGJldHdlZW4gY29tbWVudHMgd2l0aCBDb2xsZWN0aXZlIFByb25vdW5zIGFuZCBXaXRob3V0IGluIFBvc3RzIGZyb20gL3Ivd29ybGRuZXdzIGJ5IFNjYWxlIG9mIFRocmVhdC9SZXNvbHV0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImFsbCBwb3N0cyBmcm9tIDIwMTYgd2l0aCBhdCBsZWFzdCA1MDAgY29tbWVudHMsIGVhY2ggY2lyY2xlIHJlcHJlc2VudHMgYSBwb3N0IHNjYWxlZCBieSBudW1iZXIgb2YgY29tbWVudHMiLAogICAgICAgY2FwdGlvbiA9ICIiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEpICsgdGhlbWVfY2xhc3NpYygpICt4bGFiKCIiKSArIHlsYWIoIkF2ZXJhZ2Ugc2NvcmUgcmF0aW8gYmV0d2VlbiBjb21tZW50cyB3aXRoIGFuZCB3aXRob3V0IGNvbGxlY3RpdmUgcHJvbm91bnMiKSAKICAKYGBgCgojSFlQT1RIRVNJUyBURVNUSU5HCmBgYHtyfQojU2NvcmUgcmF0aW8KcG9wX3NkIDwtIHNkKHdvcmxkbmV3c19ncmFwaHMyJHNjb3JlX3JhdGlvKQp3b3JsZG5ld3NfZ3JhcGhzMiAlPiUgZ3JvdXBfYnkodGhyZWF0X3Njb3JlKSAlPiUgc3VtbWFyaXNlKAogIE4gPSBuKCksCiAgc2NvcmVfcmF0aW9fYXZnID0gbWVkaWFuKHNjb3JlX3JhdGlvKSwKICB0X3Njb3JlID0gKHNjb3JlX3JhdGlvX2F2ZyAtIDEpKnNxcnQoTikvcG9wX3NkLAogIHAgPSBwdCgtYWJzKHRfc2NvcmUpLGRmPU4tMSkKKQogICAgICAKYGBgCgoK